package com.qf.CompletableFuture;

import javax.swing.*;
import java.util.concurrent.*;

/**
 * 演示CompletableFuture类中的方法
 */
public class Demo01 {

    // 1.创建一个自己的线程池
    private static ThreadPoolExecutor executors = new ThreadPoolExecutor(
            5, // 核心线程池,线程池中至少有5个线程
            15, // 线程池中的最大线程数量
            3,  // 空闲线程回收的时间
            TimeUnit.SECONDS, // 时间单位
            new ArrayBlockingQueue(20), // 线程池中的线程已经最大了，剩下的引用压入队列等待空闲线程
            Executors.defaultThreadFactory(),  // 创建线程的默认工厂
            new ThreadPoolExecutor.AbortPolicy() // 拒绝策略，队列的长度满了以后执行的拒绝策略
    );

    public static void main(String[] args) throws ExecutionException, InterruptedException {


        // 1.启动一个异步任务，使用内置线程池
//        CompletableFuture.runAsync(() -> { // 使用内置的线程池
//            System.out.println("启动一个异步任务去执行，没有返回值:" + Thread.currentThread().getId());
//        });

        // 2.启动一个异步任务，使用自己的线程池
//        CompletableFuture.runAsync(() -> {
//            System.out.println("使用自己的线程池，申请一个线程池去执行，没有返回值:" + Thread.currentThread().getId());
//        }, executors);

        // 3.启动一个异步任务，有返回值
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("使用自己的线程池，申请一个线程去执行，有返回值:" + Thread.currentThread().getId());
            int sum = 0;
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 10; i++) {
                sum += i;
            }
            return sum;
        }, executors);

        Integer sum = future.get();// 这个方法是一个阻塞方法，
        System.out.println("sum:" + sum);


        System.out.println("这是主线程:" + Thread.currentThread().getId());

    }
}
